GCC编译器你需要知道的入门知识

您所在的位置:网站首页 gcc 删除符号表 GCC编译器你需要知道的入门知识

GCC编译器你需要知道的入门知识

#GCC编译器你需要知道的入门知识| 来源: 网络整理| 查看: 265

在为Linux开发应用程序时,绝大多数情况下使用的都是C++语言,因此几乎每一位Linux程序员面临的首要问题都是如何灵活运用C编译器。目前 Linux下最常用的C语言编译器是GCC(GNU Compiler Collection),它是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。GCC不仅功能非常强大,结构也异常灵活。最值得称道的一点就是它可以通过不同的前端模块来支持各种语言,如Java、 Fortran、Pascal、Modula-3和Ada等。

开放、自由和灵活是Linux的魅力所在,而这一点在GCC上的体现就是程序员通过它能够更好地控制整个编译过程。在使用GCC编译程序时,编译过程可以被细分为四个阶段:

◆ 预处理(Pre-Processing)◆ 编译(Compiling)◆ 汇编(Assembling)◆ 链接(Linking)

Linux 程序员可以根据自己的需要让GCC在编译的任何阶段结束,以便检查或使用编译器在该阶段的输出信息,或者对最后生成的二进制文件进行控制,以便通过加入不 同数量和种类的调试代码来为今后的调试做好准备。和其它常用的编译器一样,GCC也提供了灵活而强大的代码优化功能,利用它可以生成执行效率更高的代码。GCC提供了30多条警告信息和三个警告级别,使用它们有助于增强程序的稳定性和可移植性。此外,GCC还对标准的C和C++语言进行了大量的扩展,提高程序的执行效率,有助于编译器进行代码优化,能够减轻编程的工作量。

GCC起步

在学习使用GCC之前,下面的这个例子能够帮助用户迅速理解GCC的工作原理,并将其立即运用到实际的项目开发中去。首先用熟悉的编辑器输入清单1所示的代码:清单1:hello.c

#include int main(void){printf ("Hello world, Linux programming!/n");return 0;}

然后执行下面的命令编译和运行这段程序:

# gcc hello.c -o hello# ./helloHello world, Linux programming!

从 程序员的角度看,只需简单地执行一条GCC命令就可以了,但从编译器的角度来看,却需要完成一系列非常繁杂的工作。首先,GCC需要调用预处理程序 cpp,由它负责展开在源文件中定义的宏,并向其中插入"#include"语句所包含的内容;接着,GCC会调用ccl和as将处理后的源代码编译成目 标代码;最后,GCC会调用链接程序ld,把生成的目标代码链接成一个可执行程序。为了更好地理解GCC的工作过程,可以把上述编译过程分成几个步骤单独进行,并观察每步的运行结果。第一步是进行预编译,使用-E参数可以让GCC在预处理结束后停止编译过程:

# gcc -E hello.c -o hello.i

此时若查看hello.i文件中的内容,会发现stdio.h的内容确实都插到文件里去了,而其它应当被预处理的宏定义也都做了相应的处理。下一步是将hello.i编译为目标代码,这可以通过使用-c参数来完成:

# gcc -c hello.i -o hello.o

GCC默认将.i文件看成是预处理后的C语言源代码,因此上述命令将自动跳过预处理步骤而开始执行编译过程,也可以使用-x参数让GCC从指定的步骤开始编译。最后一步是将生成的目标文件链接成可执行文件:

# gcc hello.o -o hello

在 采用模块化的设计思想进行软件开发时,通常整个程序是由多个源文件组成的,相应地也就形成了多个编译单元,使用GCC能够很好地管理这些编译单元。假设有 一个由foo1.c和foo2.c两个源文件组成的程序,为了对它们进行编译,并最终生成可执行程序foo,可以使用下面这条命令:

# gcc foo1.c foo2.c -o foo

如果同时处理的文件不止一个,GCC仍然会按照预处理、编译和链接的过程依次进行。如果深究起来,上面这条命令大致相当于依次执行如下三条命令:

# gcc -c foo1.c -o foo1.o# gcc -c foo2.c -o foo2.o# gcc foo1.o foo2.o -o foo

在 编译一个包含许多源文件的工程时,若只用一条GCC命令来完成编译是非常浪费时间的。假设项目中有100个源文件需要编译,并且每个源文件中都包含 10000行代码,如果像上面那样仅用一条GCC命令来完成编译工作,那么GCC需要将每个源文件都重新编译一遍,然后再全部连接起来。很显然,这样浪费 的时间相当多,尤其是当用户只是修改了其中某一个文件的时候,完全没有必要将每个文件都重新编译一遍,因为很多已经生成的目标文件是不会改变的。要解决这 个问题,关键是要灵活运用GCC,同时还要借助像Make这样的工具。

警告提示功能

GCC包含完整的出错检查和警告提示功能,它们可以帮助Linux程序员写出更加专业和优美的代码。先来读读清单2所示的程序,这段代码写得很糟糕,仔细检查一下不难挑出很多毛病:

◆main函数的返回值被声明为void,但实际上应该是int;◆使用了GNU语法扩展,即使用long long来声明64位整数,不符合ANSI/ISO C语言标准;◆main函数在终止前没有调用return语句。

清单2:illcode.c

#include void main(void){long long int var = 1;printf("It is not standard C code!/n");}

下面来看看GCC是如何帮助程序员来发现这些错误的。当GCC在编译不符合ANSI/ISO C语言标准的源代码时,如果加上了-pedantic选项,那么使用了扩展语法的地方将产生相应的警告信息:

# gcc -pedantic illcode.c -o illcodeillcode.c: In function `main':illcode.c:9: ISO C89 does not support `long long'illcode.c:8: return type of `main' is not `int'

需 要注意的是,-pedantic编译选项并不能保证被编译程序与ANSI/ISO C标准的完全兼容,它仅仅只能用来帮助Linux程序员离这个目标越来越近。或者换句话说,-pedantic选项能够帮助程序员发现一些不符合 ANSI/ISO C标准的代码,但不是全部,事实上只有ANSI/ISO C语言标准中要求进行编译器诊断的那些情况,才有可能被GCC发现并提出警告。除了-pedantic之外,GCC还有一些其它编译选项也能够产生有用的警告信息。这些选项大多以-W开头,其中最有价值的当数-Wall了,使用它能够使GCC产生尽可能多的警告信息:

# gcc -Wall illcode.c -o illcodeillcode.c:8: warning: return type of `main' is not `int'illcode.c: In function `main':illcode.c:9: warning: unused variable `var'

GCC给出的警告信息虽然从严格意义上说不能算作是错误,但却很可能成为错误的栖身之所。一个优秀的Linux程序员应该尽量避免产生警告信息,使自己的代码始终保持简洁、优美和健壮的特性。在 处理警告方面,另一个常用的编译选项是-Werror,它要求GCC将所有的警告当成错误进行处理,这在使用自动编译工具(如Make等)时非常有用。如 果编译时带上-Werror选项,那么GCC会在所有产生警告的地方停止编译,迫使程序员对自己的代码进行修改。只有当相应的警告信息消除时,才可能将编 译过程继续朝前推进。执行情况如下:

# gcc -Wall -Werror illcode.c -o illcodecc1: warnings being treated as errorsillcode.c:8: warning: return type of `main' is not `int'illcode.c: In function `main':illcode.c:9: warning: unused variable `var'

对Linux程序员来讲,GCC给出的警告信息是很有价值的,它们不仅可以帮助程序员写出更加健壮的程序,而且还是跟踪和调试程序的有力工具。建议在用GCC编译源代码时始终带上-Wall选项,并把它逐渐培养成为一种习惯,这对找出常见的隐式编程错误很有帮助。

库依赖

在Linux 下开发软件时,完全不使用第三方函数库的情况是比较少见的,通常来讲都需要借助一个或多个函数库的支持才能够完成相应的功能。从程序员的角度看,函数库实 际上就是一些头文件(.h)和库文件(.so或者.a)的集合。虽然Linux下的大多数函数都默认将头文件放到/usr/include/目录下,而库 文件则放到/usr/lib/目录下,但并不是所有的情况都是这样。正因如此,GCC在编译时必须有自己的办法来查找所需要的头文件和库文件。GCC采用搜索目录的办法来查找所需要的文件,-I选项可以向GCC的头文件搜索路径中添加新的目录。例如,如果在/home/xiaowp/include/目录下有编译时所需要的头文件,为了让GCC能够顺利地找到它们,就可以使用-I选项:

# gcc foo.c -I /home/xiaowp/include -o foo

同样,如果使用了不在标准位置的库文件,那么可以通过-L选项向GCC的库文件搜索路径中添加新的目录。例如,如果在/home/xiaowp/lib/目录下有链接时所需要的库文件libfoo.so,为了让GCC能够顺利地找到它,可以使用下面的命令:

# gcc foo.c -L /home/xiaowp/lib -lfoo -o foo

值 得好好解释一下的是-l选项,它指示GCC去连接库文件libfoo.so。Linux下的库文件在命名时有一个约定,那就是应该以lib三个字母开头, 由于所有的库文件都遵循了同样的规范,因此在用-l选项指定链接的库文件名时可以省去lib三个字母,也就是说GCC在对-lfoo进行处理时,会自动去 链接名为libfoo.so的文件。Linux下的库文件分为两大类分别是动态链接库(通常以.so结尾)和静态链接库(通常以.a 结尾),两者的差别仅在程序执行时所需的代码是在运行时动态加载的,还是在编译时静态加载的。默认情况下,GCC在链接时优先使用动态链接库,只有当动态 链接库不存在时才考虑使用静态链接库,如果需要的话可以在编译时加上-static选项,强制使用静态链接库。例如,如果在 /home/xiaowp/lib/目录下有链接时所需要的库文件libfoo.so和libfoo.a,为了让GCC在链接时只用到静态链接库,可以使 用下面的命令:

# gcc foo.c -L /home/xiaowp/lib -static -lfoo -o foo

代码优化

代 码优化指的是编译器通过分析源代码,找出其中尚未达到最优的部分,然后对其重新进行组合,目的是改善程序的执行性能。GCC提供的代码优化功能非常强大, 它通过编译选项-On来控制优化代码的生成,其中n是一个代表优化级别的整数。对于不同版本的GCC来讲,n的取值范围及其对应的优化效果可能并不完全相 同,比较典型的范围是从0变化到2或3。编译时使用选项-O可以告诉GCC同时减小代码的长度和执行时间,其效果等价于-O1。在这 一级别上能够进行的优化类型虽然取决于目标处理器,但一般都会包括线程跳转(Thread Jump)和延迟退栈(Deferred Stack Pops)两种优化。选项-O2告诉GCC除了完成所有-O1级别的优化之外,同时还要进行一些额外的调整工作,如处理器指令调度等。选项-O3则除了完 成所有-O2级别的优化之外,还包括循环展开和其它一些与处理器特性相关的优化工作。通常来说,数字越大优化的等级越高,同时也就意味着程序的运行速度越 快。许多Linux程序员都喜欢使用-O2选项,因为它在优化长度、编译时间和代码大小之间,取得了一个比较理想的平衡点。

下面通过具体实例来感受一下GCC的代码优化功能,所用程序如清单3所示。清单3:optimize.c

#include int main(void){double counter;double result;double temp;for (counter = 0;counter

首先不加任何优化选项进行编译:

# gcc -Wall optimize.c -o optimize

借助Linux提供的time命令,可以大致统计出该程序在运行时所需要的时间:

# time ./optimizeResult is 400002019.000000real 0m14.942suser 0m14.940ssys 0m0.000s

接下去使用优化选项来对代码进行优化处理:

# gcc -Wall -O optimize.c -o optimize

在同样的条件下再次测试一下运行时间:

# time ./optimizeResult is 400002019.000000real 0m3.256suser 0m3.240ssys 0m0.000s

对 比两次执行的输出结果不难看出,程序的性能的确得到了很大幅度的改善,由原来的14秒缩短到了3秒。这个例子是专门针对GCC的优化功能而设计的,因此优 化前后程序的执行速度发生了很大的改变。尽管GCC的代码优化功能非常强大,但作为一名优秀的Linux程序员,首先还是要力求能够手工编写出高质量的代 码。如果编写的代码简短,并且逻辑性强,编译器就不会做更多的工作,甚至根本用不着优化。优化虽然能够给程序带来更好的执行性能,但在如下一些场合中应该避免优化代码:◆ 程序开发的时候 优化等级越高,消耗在编译上的时间就越长,因此在开发的时候最好不要使用优化选项,只有到软件发行或开发结束的时候,才考虑对最终生成的代码进行优化。◆ 资源受限的时候 一些优化选项会增加可执行代码的体积,如果程序在运行时能够申请到的内存资源非常紧张(如一些实时嵌入式设备),那就不要对代码进行优化,因为由这带来的负面影响可能会产生非常严重的后果。◆ 跟踪调试的时候 在对代码进行优化的时候,某些代码可能会被删除或改写,或者为了取得更佳的性能而进行重组,从而使跟踪和调试变得异常困难。

调试

一个功能强大的调试器不仅为程序员提供了跟踪程序执行的手段,而且还可以帮助程序员找到解决问题的方法。对于Linux程序员来讲,GDB(GNU Debugger)通过与GCC的配合使用,为基于Linux的软件开发提供了一个完善的调试环境。默 认情况下,GCC在编译时不会将调试符号插入到生成的二进制代码中,因为这样会增加可执行文件的大小。如果需要在编译时生成调试符号信息,可以使用GCC 的-g或者-ggdb选项。GCC在产生调试符号时,同样采用了分级的思路,开发人员可以通过在-g选项后附加数字1、2或3来指定在代码中加入调试信息 的多少。默认的级别是2(-g2),此时产生的调试信息包括扩展的符号表、行号、局部或外部变量信息。级别3(-g3)包含级别2中的所有调试信息,以及 源代码中定义的宏。级别1(-g1)不包含局部变量和与行号有关的调试信息,因此只能够用于回溯跟踪和堆栈转储之用。回溯跟踪指的是监视程序在运行过程中 的函数调用历史,堆栈转储则是一种以原始的十六进制格式保存程序执行环境的方法,两者都是经常用到的调试手段。GCC产生的调试符号 具有普遍的适应性,可以被许多调试器加以利用,但如果使用的是GDB,那么还可以通过-ggdb选项在生成的二进制代码中包含GDB专用的调试信息。这种 做法的优点是可以方便GDB的调试工作,但缺点是可能导致其它调试器(如DBX)无法进行正常的调试。选项-ggdb能够接受的调试级别和-g是完全一样 的,它们对输出的调试符号有着相同的影响。需要注意的是,使用任何一个调试选项都会使最终生成的二进制文件的大小急剧增加,同时增加程序在执行时的开销,因此调试选项通常仅在软件的开发和调试阶段使用。调试选项对生成代码大小的影响从下面的对比过程中可以看出来:

# gcc optimize.c -o optimize# ls optimize -l-rwxrwxr-x 1 xiaowp xiaowp 11649 Nov 20 08:53 optimize (未加调试选项)# gcc -g optimize.c -o optimize# ls optimize -l-rwxrwxr-x 1 xiaowp xiaowp 15889 Nov 20 08:54 optimize (加入调试选项)

虽然调试选项会增加文件的大小,但事实上Linux中的许多软件在测试版本甚至最终发行版本中仍然使用了调试选项来进行编译,这样做的目的是鼓励用户在发现问题时自己动手解决,是Linux的一个显著特色。下面还是通过一个具体的实例说明如何利用调试符号来分析错误,所用程序见清单4所示。清单4:crash.c

#include int main(void){int input =0;printf("Input an integer:");scanf("%d", input);printf("The integer you input is %d/n", input);return 0;}

编译并运行上述代码,会产生一个严重的段错误(Segmentation fault)如下:

# gcc -g crash.c -o crash# ./crashInput an integer:10Segmentation fault

为了更快速地发现错误所在,可以使用GDB进行跟踪调试,方法如下:

# gdb crashGNU gdb Red Hat Linux (5.3post-0.20021129.18rh)......(gdb)

当GDB提示符出现的时候,表明GDB已经做好准备进行调试了,现在可以通过run命令让程序开始在GDB的监控下运行:

(gdb) runStarting program: /home/xiaowp/thesis/gcc/code/crashInput an integer:10Program received signal SIGSEGV, Segmentation fault.0x4008576b in _IO_vfscanf_internal () from /lib/libc.so.6

仔 细分析一下GDB给出的输出结果不难看出,程序是由于段错误而导致异常中止的,说明内存操作出了问题,具体发生问题的地方是在调用 _IO_vfscanf_internal ( )的时候。为了得到更加有价值的信息,可以使用GDB提供的回溯跟踪命令backtrace,执行结果如下:

(gdb) backtrace

#0 0x4008576b in _IO_vfscanf_internal () from /lib/libc.so.6

#1 0xbffff0c0 in ?? ()

#2 0x4008e0ba in scanf () from /lib/libc.so.6

#3 0x08048393 in main () at crash.c:11

#4 0x40042917 in __libc_start_main () from /lib/libc.so.6

跳过输出结果中的前面三行,从输出结果的第四行中不难看出,GDB已经将错误定位到crash.c中的第11行了。现在仔细检查一下:

(gdb) frame 3

#3 0x08048393 in main () at crash.c:11

11 scanf("%d", input);

使用GDB提供的frame命令可以定位到发生错误的代码段,该命令后面跟着的数值可以在backtrace命令输出结果中的行首找到。现在已经发现错误所在了,应该将scanf("%d", input);改为scanf("%d", &input);完成后就可以退出GDB了,命令如下:

(gdb) quit

GDB的功能远远不止如此,它还可以单步跟踪程序、检查内存变量和设置断点等。调 试时可能会需要用到编译器产生的中间结果,这时可以使用-save-temps选项,让GCC将预处理代码、汇编代码和目标代码都作为文件保存起来。如果 想检查生成的代码是否能够通过手工调整的办法来提高执行性能,在编译过程中生成的中间文件将会很有帮助,具体情况如下:

# gcc -save-temps foo.c -o foo# ls foo*foo foo.c foo.i foo.s

GCC 支持的其它调试选项还包括-p和-pg,它们会将剖析(Profiling)信息加入到最终生成的二进制代码中。剖析信息对于找出程序的性能瓶颈很有帮 助,是协助Linux程序员开发出高性能程序的有力工具。在编译时加入-p选项会在生成的代码中加入通用剖析工具(Prof)能够识别的统计信息,而- pg选项则生成只有GNU剖析工具(Gprof)才能识别的统计信息。最后提醒一点,虽然GCC允许在优化的同时加入调试符号信息, 但优化后的代码对于调试本身而言将是一个很大的挑战。代码在经过优化之后,在源程序中声明和使用的变量很可能不再使用,控制流也可能会突然跳转到意外的地 方,循环语句有可能因为循环展开而变得到处都有,所有这些对调试来讲都将是一场噩梦。建议在调试的时候最好不使用任何优化选项,只有当程序在最终发行的时 候才考虑对其进行优化。

原文标题:关于GCC,你需要知道这些入门知识

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式ARM】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

扫一扫,分享给好友

复制链接分享 评论

发布评论请先 登录

相关推荐

昉星光开发板介绍 昉·星光基于RISC-V架构,搭载JH7100视觉处理芯片,使开源达到更高的水平,开发者从而得到更大的自由及更强的能力去创新和... 发表于 03-21 17:46 • 1016次 阅读 昉惊鸿7100芯片 datasheet 发表于 03-21 17:43 • 926次 阅读 昉星光单板计算机产品手册 发表于 03-21 17:36 • 802次 阅读 盘点 5 款值得收藏的 Linux 开发板 [quote]导读:我给大家整理了 5 款值得收藏的 Linux 开发板,有些已经涨价很多了。至于未来还能不能继续“理财”,大家自行判断... 发表于 03-21 15:54 • 517次 阅读 盘点 5 款值得收藏的 Linux 开发板 SONiC正在成为云架构中领先的开放网络操作系统 SONIC是一个基于 Linux 的开源网络操作系统,能够在多个厂商的交换机和专用集成电路(ASIC.... 的头像 是德科技KEYSIGHT 发表于 03-20 13:16 • 216次 阅读 ADI为Linux发行版扩充器件驱动 Ti Group选择是德科技5G测试平台 Keysight Technologies, Inc.(纽约证券交易所代码:KEYS)是一家领先的技.... 发表于 03-18 14:51 • 1115次 阅读 关于Linux命令行烧写固件 说明:如果已经安装旧版本的烧写工具,请先点击“驱动卸载”按钮下载驱动,然后再点击 “驱动安装”按钮安.... 的头像 HarmonyOS官方合作社区 发表于 03-18 10:57 • 134次 阅读 i.MX6ULL驱动开发3—GPIO寄存器配置原理 介绍了字符设备驱动的两种新旧开发方式,并使用一个虚拟的字符驱动来学习字符设备的开发的流程。 的头像 码农爱学习 发表于 03-18 08:17 • 184次 阅读 i.MX6ULL驱动开发3—GPIO寄存器配置原理 RISC-V GNU编译器工具链 这是RISC-V C和 C++交叉编译器。它支持两种构建模式:通用ELF/Newlib工具链和更复杂.... 发表于 03-17 16:36 • 16次 阅读 Hi3861开发板串口看不到命令行是为什么?   1)开发板启动,只有教程中的AT命令能使用,敲回车报ERROR;   2)开发板没有linux常用命令吗(ls、pwd、cd)?还... 发表于 03-17 15:41 • 820次 阅读 gcc编译的基础知识及编译时常见的问题汇总 1、C代码是如何被编译生成二进制文件的 C代码的编译步骤C代码编译的步骤,需要经历预编译、编译、汇编、链接等几个关键步骤,... 发表于 03-17 11:42 • 1012次 阅读 i.MX6ULL嵌入式Linux开发6-系统烧写到eMMC 本篇主要介绍了Linux移植的系统打包烧录的EMMC的方法,使用MfgTool工具,将**uboot.... 的头像 码农爱学习 发表于 03-17 09:17 • 1644次 阅读 i.MX6ULL嵌入式Linux开发6-系统烧写到eMMC RISCV GCC汇编结果错误 安装riscv的官方工具链(.ident  "GCC: (GNU) 7.2.0"),后对一个c文件进行编译,启动-O3选项时候,编译得到的... 发表于 03-16 17:15 • 1865次 阅读 GH集成开发环境和编译器 说实话,以前也用过正版的编译器,我记得之前用过正版的IAR编译器license也没有多贵,而最近用了.... 的头像 嵌入式程序猿 发表于 03-16 17:08 • 311次 阅读 一文深入理解操作系统的进程调度 想深入理解操作系统的进程调度,需要先获得一些准备知识,这样后面就不懵圈啦: 的头像 Linux爱好者 发表于 03-16 10:58 • 161次 阅读 如何编译已有的C++去生成可在OpenHarmony系统使用的动态库文件呢 原有Linux环境下的C++ 项目,可通过在CMakeList文件中设置使用的工具链,编译出各平台开发板上可使用的so文件。 请问,我现... 发表于 03-16 10:42 • 673次 阅读 如何鉴别Linux服务器是否被入侵 随着开源产品的越来越盛行,作为一个Linux运维工程师,能够清晰地鉴别异常机器是否已经被入侵了显得至.... 的头像 马哥Linux运维 发表于 03-16 10:08 • 220次 阅读 Linux namespace和cgroups简介 先放结论,namespace 是用来做资源隔离, cgroup 是用来做资源限制。 的头像 马哥Linux运维 发表于 03-16 09:03 • 212次 阅读 VScode编译器如何配置C/C++编译环境 昨天有伙伴私信我,为什么我用C语言写的hello world几行代码,在编译器里面报错了呢? 的头像 C语言编程学习基地 发表于 03-16 08:38 • 139次 阅读 基础的Linux操作命令 IC设计是在linux环境下,很多操作需要在Terminal中进行,因此想要学习IC设计,就必须先需.... 的头像 FPGA之家 发表于 03-15 13:42 • 146次 阅读 RT-Thread操作系统之RTGUI设计集锦 RTGUI 设计得与其他 GUI 是不相类似的,所以很有必要建立一些基本概念。RTGUI 内部是完全线程化的,显示一个 UI ... 发表于 03-15 10:50 • 731次 阅读 BPF系统调用与Tracing类型的BPF程序 既然是提供向内核注入代码的技术,那么安全问题肯定是重中之重。平时防范他人通过漏洞向内核中注入代码,这.... 的头像 Linux阅码场 发表于 03-14 16:42 • 334次 阅读 AbsInt代码安全性能分析套件产品介绍 德国AbsInt公司是专注于安全苛求软件研发、确认、验证和认证的工具链供应商。能够为客户提供较完整的.... 的头像 经纬恒润 发表于 03-14 15:32 • 238次 阅读 盘点5款值得收藏的Linux开发板 最近股市又哀鸿遍野……于是,那句 “树莓派是最好的理财产品”又开始在我耳边萦绕。“缺芯”笼罩之下,开.... 的头像 话说科技 发表于 03-14 15:12 • 329次 阅读 盘点5款值得收藏的Linux开发板 霍尼韦尔智能楼宇技术助力小镇建设_ADI为Linux发行版扩充1000多个器件驱动  2022年2月11日,中国北京——霍尼韦尔宣布与中建二局安装工程有限公司和北京市设备安装工程集团有.... 的头像 电子魔法师 发表于 03-14 15:04 • 615次 阅读 C语言使用回调函数模拟委托与反射 函数是C语言的核心概念。主调函数(caller)调用被调函数(callee)是一般的调用关系,如果被.... 的头像 STM32嵌入式开发 发表于 03-14 10:19 • 143次 阅读 i.MX6ULL嵌入式Linux开发5-根文件系统完善 上篇文章,使用BusyBox构建了基础的嵌入式Linux系统的根文件系统,基本的功能可以正常运行,但.... 的头像 码农爱学习 发表于 03-14 08:44 • 185次 阅读 i.MX6ULL嵌入式Linux开发5-根文件系统完善 i.MX6ULL嵌入式Linux开发4-根文件系统构建 本篇使用BusyBox来构建根文件系统,并通过NFS网络调试的方式实现根文件系统挂载测试,实测时解决.... 的头像 码农爱学习 发表于 03-14 08:41 • 204次 阅读 i.MX6ULL嵌入式Linux开发4-根文件系统构建 i.MX6ULL嵌入式Linux开发3-Kernel移植 本文进行Linux内核的移植。 的头像 码农爱学习 发表于 03-14 08:36 • 203次 阅读 i.MX6ULL嵌入式Linux开发3-Kernel移植 第一个C语言编译器的来源 不知道你有没有想过,某种编程语言的第一个编译器是怎么来的呢?这不就是“鸡生蛋,蛋生鸡”的问题吗? 的头像 嵌入式ARM 发表于 03-12 12:36 • 678次 阅读 有没有能用在51单片机平台上的语音芯片? 最近看了一下云知声的蜂鸟M系列的离线语音,但是研究了半天不知道能不能移植到51单片机的平台上(就是通过串口通讯),后来又看... 发表于 03-11 17:08 • 1707次 阅读 提高Linux服务器性能的20个技巧  Linux功能丰富、强大、灵活,你可以用它完成各种任务,在这篇文章中,我们将讨论一些提高Linux.... 的头像 Linux爱好者 发表于 03-11 10:14 • 191次 阅读 PCB分析常见方法 软件代码有bug,可以通过人工查找,也可以通过编译发现,同时也可以通过代码静态分析工具找到错误或警告.... 的头像 strongerHuang 发表于 03-10 17:55 • 830次 阅读 51点灯与Linux驱动点灯的区别 嵌入式初学者入门的第一个“项目”就是LED点灯,那么,本文带你看看51、STM32、Linux点灯有.... 的头像 strongerHuang 发表于 03-10 17:37 • 1411次 阅读 为VisionFive星光板上创建Debian系统镜像 在RISC-V 星光板VisionFive上创建Debian/Linux系统 发表于 03-09 20:52 • 14次 阅读 为VisionFive星光板上创建Debian系统镜像 C/C++在线编译器的功能 作为程序员,使用编译器是必备技能,但是从入门到放弃,基本上就是在开发环境安装、配置这一步。。。 的头像 strongerHuang 发表于 03-09 17:52 • 3500次 阅读 C语言中内存四区模型的本质区别和代码分析 ●数据类型可理解为创建变量的模具:是固定内存大小的别名。 的头像 嵌入式ARM 发表于 03-09 14:45 • 260次 阅读 Linux内核代码修改将为性能测试获8450%提升 Jason Donenfeld 是 WireGuard 的主要开发者,同时他也是 Linux 内核随.... 的头像 马哥Linux运维 发表于 03-09 14:16 • 234次 阅读 鲲鹏开发套件DevKit 2.0加速应用迁移 多样性计算时代,跨平台的应用迁移和开发不简单数字经济时代,自动驾驶、智能制造、电子政务、智慧金融等新.... 的头像 华为开发者社区 发表于 03-09 14:14 • 261次 阅读 Linux私房菜基础篇-第三版 Linux私房菜基础篇-第三版免费下载。 发表于 03-07 16:46 • 46次 阅读 《Linux命令行大全》(英文版) [美]William E. Shotts Jr. 著 发表于 03-07 16:29 • 23次 阅读 i.MX6ULL嵌入式Linux开发2-uboot移植实践 上篇文章,我们介绍了如何使用NXP原厂的uboot进行编译和烧写,将uboot运行在自己的开发板上。.... 的头像 码农爱学习 发表于 03-07 09:00 • 1698次 阅读 i.MX6ULL嵌入式Linux开发2-uboot移植实践 i.MX6ULL嵌入式Linux开发1-uboot移植初探 本系列教程以i.MX6ULL处理器的ARM开发板为实验基础,学习记录嵌入式Linux开发的各种知识与.... 的头像 码农爱学习 发表于 03-07 08:57 • 1237次 阅读 i.MX6ULL嵌入式Linux开发1-uboot移植初探 万象奥科RZ G2L核心板高低温测试 评估测试RZ/G2L核心板环境适应性,测试低温启动、高温工作、高低温循环状态下的工作情况。 的头像 武汉万象奥科 发表于 03-03 15:27 • 10次 阅读 万象奥科RZ G2L核心板高低温测试 RZ G2L核心板以太网接口性能测试 武汉万象奥科RZ/G2L核心板支持2路千兆以太网接口,评估测试RZ/G2L双网口实际传输速率。 的头像 武汉万象奥科 发表于 03-03 14:04 • 10次 阅读 RZ G2L核心板以太网接口性能测试 RZ/G2L核心板功耗测试 测试RZ/G2L核心板静态功耗与CPU满负载时的负载功耗,辅助产品设计中的散热方案评估。 的头像 武汉万象奥科 发表于 03-03 11:35 • 9次 阅读 RZ/G2L核心板功耗测试 linux常用命令大全 linux常用命令大全,一些常用的命令都可以找到 发表于 03-03 09:20 • 48次 阅读 为什么要在汽车上使用SOA架构 整车E/E架构升级,硬件架构上从分布式ECU向域集中式,进一步向中央集中式+区域控制器升级; 发表于 03-02 09:15 • 86次 阅读 为什么要在汽车上使用SOA架构 瑞萨电子推出64位RISC-V CPU内核RZ/Five通用MPU,开创RISC-V技术先河 瑞萨电子今日宣布,推出基于64位RISC-V CPU内核的RZ/Five通用微处理器(MPU)——R.... 发表于 03-01 13:54 • 623次 阅读 瑞萨电子推出64位RISC-V CPU内核RZ/Five通用MPU,开创RISC-V技术先河 keil5+STM32F103C8T6设计的智能插座+人体感应灯 支持跨平台编译运行 这是基于STM32设计的智能插座+人体感应灯。SRM32F103C8T6最小系统板、红外热释电人体感.... 的头像 DS小龙哥-嵌入式技术 发表于 02-28 13:19 • 1923次 阅读 keil5+STM32F103C8T6设计的智能插座+人体感应灯 支持跨平台编译运行 迅为iTOP-STM32MP157开发板 迅为ITOP-STM32MP157是基于ST的STM32MP157芯片开发的一款开发平台。在STM3.... 发表于 02-23 14:43 • 18次 阅读 迅为STM32MP157开发板入门教程之外设功能验证 迅为STM32MP157开发板入门教程之外设功能验证 的头像 平常心0 发表于 02-23 14:16 • 27次 阅读 迅为STM32MP157开发板入门教程之外设功能验证 Xilinx SystemVerilog中的基本联合体 在 SystemVerilog 中,联合体只是信号,可通过不同名称和纵横比来加以引用。 其工作方式为.... 的头像 赛灵思 发表于 02-19 19:01 • 211次 阅读 Xilinx SystemVerilog中的基本联合体 国产平台T3如何快速部署电力能源神器-Docker容器 前 言随着电网数据信息化的深入,电网的各种应用服务增长迅速,原有应用服务部署方式面临着资源利用率低、.... 的头像 Tronlong创龙科技 发表于 02-17 13:56 • 24次 阅读 国产平台T3如何快速部署电力能源神器-Docker容器 Petalinux2020.01 内核DMA驱动调试说明 Petalinux2020.01 内核DMA驱动调试过程分享 的头像 赛灵思 发表于 02-16 16:21 • 148次 阅读 为什么要用C语言实现面向对象   不知道有多少人去了解过语言的发展史,早期C语言的语法功能其实比较简单。随着应用需求和场景的变化,.... 的头像 硬件攻城狮 发表于 02-16 16:19 • 417次 阅读 为什么要用C语言实现面向对象 Linux编程入门 Linux编程入门 发表于 02-16 14:55 • 64次 阅读 如何配置和操作Linux驱动程序开发板 本文档概述了利用Linux开发板为 Linux 内核开发驱动程序的基础知识,并简单介绍了如何配置和操.... 的头像 德州仪器 发表于 02-15 13:36 • 376次 阅读 如何配置和操作Linux驱动程序开发板 选型必备!最新最全的工业核心板目录大全来了!! 随着嵌入式技术的发展,越来越多的处理器应运而生。除了国外的主流半导体厂家,国内的半导体厂家也异军突起.... 的头像 Tronlong创龙科技 发表于 02-15 09:30 • 25次 阅读 选型必备!最新最全的工业核心板目录大全来了!! 一文详细了解五种IO模型 五种IO模型包括:阻塞IO、非阻塞IO、IO多路复用、信号驱动IO、异步IO。 的头像 硬件攻城狮 发表于 02-14 14:38 • 537次 阅读 一文详细了解五种IO模型 AM4379 AM437x ARM Cortex-A9 微处理器 (MPU) TI AM437x高性能处理器基于ARM Cortex-A9内核。 这些处理器通过3D图形加速得到增强,可实现丰富的图形用户界面,还配备了协处理器,用于进行确定性实时处理(包括EtherCAT,PROFIBUS,EnDat等工业通信协议)。该器件支持高级操作系统(HLOS)。基于Linux的® 可从TI免费获取。其它HLOS可从TI的设计网络和生态系统合作伙伴处获取。 这些器件支持对采用较低性能ARM内核的系统升级,并提供更新外设,包括QSPI-NOR和LPDDR2等存储器选项。 这些处理器包含功能方框图中显示的子系统,并且后跟相应的“说明”中添加了更多信息说明。 处理器子系统基于ARM Cortex-A9内核,PowerVR SGX™图形加速器子系统提供3D图形加速功能以支持显示和高级用户界面。 可编程实时单元子系统和工业通信子系统(PRU-ICSS与ARM内核分离,允许单独操作和计时,以实现更高的效率和灵活性.PRU-ICSS支持更多外设接口和EtherCAT,PROFINET,EtherNet /IP,PROFIBUS,以太网Powerlink,Sercos,EnDat等... 发表于 09-25 11:51 • 534次 阅读 AM4379 AM437x ARM Cortex-A9 微处理器 (MPU)


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3